package conexaoSocket;

import java.io.PrintStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import Logica.Jogador;
import Logica.Sala;
import Logica.Sistema;

public class GerenciadorDoCliente implements Runnable {
	
	private Socket clientSocket;
	private Socket socketRetorno;
	private Sistema sistema;
	private String codificacao;
	private String jogador;
	private PrintStream writerRetorno;
	private ServidorTCP servidor;
	
	public GerenciadorDoCliente(Socket socketRetorno, Socket socket, Sistema s, String codificacao, ServidorTCP servidor) throws Exception {
		this.clientSocket = socket;
		this.sistema = s;
		this.codificacao = codificacao;
		this.servidor = servidor;
		this.socketRetorno = socketRetorno;
		writerRetorno = new PrintStream(socketRetorno.getOutputStream(), true, codificacao);
	}
	
	@Override
	public void run() {
		String ipDoCliente = clientSocket.getInetAddress().getHostAddress();
		PrintStream writer = null;
		Scanner reader = null;
		try{
			writer = new PrintStream(clientSocket.getOutputStream(), true, codificacao);
			reader = new Scanner(clientSocket.getInputStream(), codificacao);
			while(true){
				String inmsg = reader.nextLine(); //l� msg enviada pelo cliente
				System.out.println("[IN]  "+ jogador +": " + inmsg);
				
				//processa msg do cliente e gera msg de resposta
				if(inmsg.equalsIgnoreCase("LOGOUT") || inmsg == null || inmsg.trim().isEmpty()){
					sistema.sair(jogador);
					writer.close();
					reader.close();
					writerRetorno.close();
					if(fecharConexao()){
						System.out.println("  Conexão com o cliente "+ jogador +" encerrada normalmente");
					}
					break;
				}
				String outmsg = processarMsg(inmsg);
				
				//envia msg ao cliente
				writer.println(outmsg);
				writer.flush();
				System.out.println("[OUT] " + jogador + ": " + outmsg);
				/*for (GerenciadorDoCliente i:lista){
					i.GetWriter().println(outmsg);
					i.GetWriter().flush();
				}*/
			}
		}
		catch(Exception ex){
			System.out.println("  Cliente "+ ipDoCliente +" pegou o beco na malandragem");
			sistema.sair(jogador);
			writer.close();
			reader.close();
			writerRetorno.close();
			fecharConexao();
		}
	}
	
	private String processarMsg(String msg){
		try{
			String[] tokens = msg.split("/");
			if(tokens[0].equalsIgnoreCase("nomejogador")){ 

				String login = tokens[1];
				String senha = tokens[2];
				
				if(sistema.LoginBD(login, senha)){
					if(sistema.ContemJogador(login)){
						return "naook";
					} else {
						jogador = login;
						sistema.entrar(login);
						return login;
					}
				}else{
					return "naocadastrado";
				}
			}

			if(tokens[0].equalsIgnoreCase("criarsala")){ 
				String sala = tokens[1];
				sistema.criarSala(sala, jogador);
				
				return sala + "|" + jogador;
			}
			
			if(tokens[0].equalsIgnoreCase("visualizarsala")){
				String salas = "";
				List<Sala> salist = sistema.visualizarSala();
				
				if (salist.isEmpty()) return "";
				else {
					for (int i = 0; i < salist.size(); i++){
						salas += salist.get(i).getNome() + "|";
					}
				return salas.substring(0, salas.length() - 1);
				}
			}
			
			if(tokens[0].equalsIgnoreCase("atualizarsala")){
				String salas = "";
				List<Sala> salist = sistema.visualizarSala();
				
				if (salist.isEmpty()) return "";
				else {
					for (int i = 0; i < salist.size(); i++){
						salas += salist.get(i).getNome() + "|";
					}
				return salas.substring(0, salas.length() - 1);
				}
			}
			
			if(tokens[0].equalsIgnoreCase("viscont")){
				int indiceSala = Integer.parseInt( tokens[1] );
				String nomeSala = sistema.visualizarSala().get(indiceSala).getNome();
				return nomeSala;
			}
			
			if(tokens[0].equalsIgnoreCase("entrarsala")){
				String name = tokens[1];
				try{
					sistema.entrarSala(sistema.jogador(jogador), sistema.sala(name));
					AvisarOutrosJogadoresNaSala();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
				return sistema.sala(name).getNome() + "|" + sistema.sala(name).getDono().getNome() + "|" + Integer.toString(sistema.sala(name).getJogadores().size());
			}
			
			if(tokens[0].equalsIgnoreCase("buscarplayer")){
				return jogador;
			}
			
			if(tokens[0].equalsIgnoreCase("jogadoresdasala")){
				String nomeSala = tokens[1];
				List<Jogador> jogadores = sistema.sala(nomeSala).getJogadores();
				String nomesJogadores = "";
				for(Jogador j : jogadores){
					nomesJogadores += j.getNome() + "{" + j.getstatusPartida().toString() + "|";
				}
				
				return /*"atualizarjogadores|" +*/ sistema.sala(nomeSala).getNomeDoDono() + "|" + nomesJogadores.substring(0, nomesJogadores.length() - 1); //retira �ltimo pipe
			}
			
			if(tokens[0].equalsIgnoreCase("jogadoresdapartida")){
				String nomeSala = tokens[1];
				List<Jogador> jogadores = sistema.Partida(sistema.sala(nomeSala)).getJogadores();
				String nomesJogadores = "";
				for(Jogador j : jogadores){
					nomesJogadores += j.getNome() + "|";
				}
				
				return sistema.Partida(sistema.sala(nomeSala)).getJogadorAtual().getNome() + "|" + jogador + "|" + nomesJogadores.substring(0, nomesJogadores.length() - 1); //retira �ltimo pipe
			}
			
			if(tokens[0].equalsIgnoreCase("prepararatualizar")){
				String nomeSala = tokens[1];
				
				return sistema.Partida(sistema.sala(nomeSala)).getJogadorAtual().getNome() + "|" + jogador + "|" + Integer.toString(sistema.Partida(sistema.sala(nomeSala)).getLancamento());
			}
			
			if(tokens[0].equalsIgnoreCase("sairsala")){
				String sala = tokens[1];
				try{
					sistema.sairSala(sistema.jogador(jogador), sistema.sala(sala));
					AvisarOutrosJogadoresNaSala();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
				return "atualizarjogadores|";
			}
			
			if(tokens[0].equalsIgnoreCase("jogadorpronto")){
				String sala = tokens[1];
				try{
					sistema.setJogadorPronto(sistema.jogador(jogador), sistema.sala(sala));
					AvisarOutrosJogadoresNaSala();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
				return "OK";
			}
			
			if(tokens[0].equalsIgnoreCase("jogadorcancel")){
				String sala = tokens[1];
				try{
					sistema.setJogadorCancelar(sistema.jogador(jogador), sistema.sala(sala));
					AvisarOutrosJogadoresNaSala();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
				return "OK";
			}
			
			if(tokens[0].equalsIgnoreCase("iniciarpartida")){
				String sala = tokens[1];
				try{
					sistema.iniciarPartida(sistema.jogador(jogador), sistema.sala(sala));
					return sistema.sala(sala).getDono().getstatusPartida().toString() + "|" + jogador + "|" + sistema.sala(sala).getDono().getNome();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("abresalaok")){
				try{
					AbraTeCesamo();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("rolardados")){
				try{
					String sala = tokens[1];
					int[] checkeds = new int[tokens.length - 2];
					for (int i = 2; i < tokens.length; i++){
						checkeds[i-2] = Integer.parseInt(tokens[i]);
					}
					if (sistema.Partida(sistema.sala(sala)).getLancamento() == 1){
						sistema.Partida(sistema.sala(sala)).lancarDados(sistema.jogador(jogador));
						AtualizarPartida();
					}
					else {
						sistema.Partida(sistema.sala(sala)).lancarDado(sistema.jogador(jogador), checkeds);
						AtualizarPartida();
					}
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("dadosatualizar")){
				String sala = tokens[1];
				try{
					int[] dadosos = sistema.Partida(sistema.sala(sala)).getResultados();
					String dados = "";
					
					for(int i = 0; i < 5; i++){
						dados += Integer.toString(dadosos[i]) + "|";
					}
					return dados.substring(0, dados.length() - 1);
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("chatmsg")){
				String sala = tokens[1];
				String ultimaMsgCliente = "";
				try{
					sistema.Partida(sistema.sala(sala)).setUltimoQueEnviouMsg(jogador);
					
					if (tokens.length > 3){
						for (int i = 2; i < tokens.length; i++){
							ultimaMsgCliente += tokens[i] + "/";
						}
						ultimaMsgCliente.substring(0, ultimaMsgCliente.length() - 1);
					}
					else ultimaMsgCliente = tokens[2];
					
					sistema.Partida(sistema.sala(sala)).setUltimaMsg(ultimaMsgCliente);
					
					ChatPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("pegarmsg")){
				String sala = tokens[1];
				try{
					return sistema.Partida(sistema.sala(sala)).getUltimaMsg();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("pegarmsgjogador")){
				String sala = tokens[1];
				try{
					return sistema.Partida(sistema.sala(sala)).getUltimoQueEnviouMsg();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("verificamudou")){
				String sala = tokens[1];
				try{
					if (sistema.Partida(sistema.sala(sala)).getLancamento() == 1) return "ok";
					else return "naook";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("atualizamudou")){
				String sala = tokens[1];
				try{
					return sistema.Partida(sistema.sala(sala)).getUltimoQueJogou() + "|" + sistema.Partida(sistema.sala(sala)).getUltimoPonto() + "|" + sistema.Partida(sistema.sala(sala)).getUltimoMarcado();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("pontosatualizar")){
				String sala = tokens[1];
				try{
					String PontosGeral = "";
					// pega os valores de "um" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getUm()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "dois" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getDois()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "tres" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getTres()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "quatro" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getQuatro()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "cinco" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getCinco()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "seis" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getSeis()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "fullhouse" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getFullhouse()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "quadra" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getQuadra()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "sequencia" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getSequencia()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "general" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getGeneral()) + "|";
					}
					
					PontosGeral = PontosGeral.substring(0, PontosGeral.length() - 1) + "{";
					
					// pega os valores de "total" de todos os jogadores.
					for (int i = 0; i < sistema.Partida(sistema.sala(sala)).getJogadores().size(); i++){
						PontosGeral += Integer.toString(sistema.Partida(sistema.sala(sala)).getJogadorEspecifico(i).getCartela().getTotal()) + "|";
					}
					
					return PontosGeral.substring(0, PontosGeral.length() - 1);
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcaum")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaUm();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("um.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getUm()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcadois")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaDois();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("dois.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getDois()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcatres")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaTres();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("três.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getTres()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcaquatro")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaQuatro();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("quatro.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getQuatro()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcacinco")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaCinco();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("cinco.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getCinco()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcaseis")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaSeis();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("seis.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getSeis()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcafh")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaFullHouse();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("FullHouse.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getFullhouse()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcaquadra")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaQuadra();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("quadra.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getQuadra()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcasequencia")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaSequencia();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("sequência.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getSequencia()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("marcageneral")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).jogadaGeneral();
					sistema.Partida(sistema.sala(sala)).setUltimoQueJogou(jogador);
					sistema.Partida(sistema.sala(sala)).setUltimoMarcado("general.");
					sistema.Partida(sistema.sala(sala)).setUltimoPonto(Integer.toString(sistema.Partida(sistema.sala(sala)).getUltimojogado().getCartela().getGeneral()));
					
					AtualizarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("abandonarpartida")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).setJogadorVazando(jogador);
					AbandonarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("sairpartida")){
				String sala = tokens[1];
				try{
					sistema.Partida(sistema.sala(sala)).getJogadores().remove(jogador);
					sistema.sairSala(sistema.jogador(jogador), sistema.sala(sala));
					
					AbandonarPartida();
					return "OK";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("jogadorvazando")){
				String sala = tokens[1];
				try{
					return sistema.Partida(sistema.sala(sala)).getJogadorVazando();
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("verificafim")){
				String sala = tokens[1];
				try{
					if(sistema.Partida(sistema.sala(sala)).IsFim()) return "true";
					else return "false";
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			if(tokens[0].equalsIgnoreCase("exibircolocacao")){
				String sala = tokens[1];
				try{
					sistema.sala(sala).setStatus(true);
					List<Jogador> jogadores = sistema.Partida(sistema.sala(sala)).getJogadores();
					Jogador[] ranking = new Jogador[jogadores.size()];
					
					for (int i = 0; i < jogadores.size(); i++){
						ranking[i] = jogadores.get(i);
					}
					
					for (int i = 0; i < ranking.length; i++){
						for (int j = 0; j < ranking.length; j++){
							if (ranking[j].getCartela().getTotal() < ranking[i].getCartela().getTotal()){
								Jogador nafrente = ranking[j];
								ranking[j] = ranking[i];
								ranking[i] = nafrente;
							}
						}
					}
					
					String nomesJogadores = "";
					for (int i = 0; i < ranking.length; i++){
						nomesJogadores += ranking[i].getNome() + "|" + Integer.toString(ranking[i].getCartela().getTotal()) + "{";
					}
					
					return nomesJogadores.substring(0, nomesJogadores.length() - 1);
				}catch(IllegalArgumentException ex){
					ex.printStackTrace();
					return "ERRO: " + ex.getMessage();
				}
			}
			
			return msg;
		}
		catch(Exception ex){
			ex.printStackTrace();
			return "ERRO";
		}
	}
	
	private void AvisarOutrosJogadoresNaSala(){
		List<GerenciadorDoCliente> ClientesNaSala = new ArrayList<>();
		Sala sala = sistema.jogador(jogador).getSalaAtual();
		List<Jogador> jogadores = sala.getJogadores();
		
		for(Jogador jogador : jogadores){
			ClientesNaSala.add(servidor.getGerenciadorDoCliente(jogador.getNome()));
		}
		
		for (GerenciadorDoCliente gdc : ClientesNaSala){
			gdc.writerRetorno.println("horadeatualizar");
			gdc.writerRetorno.flush();
		}
	}
	
	private void AtualizarPartida(){
		List<GerenciadorDoCliente> ClientesNaSala = new ArrayList<>();
		Sala sala = sistema.jogador(jogador).getSalaAtual();
		List<Jogador> jogadores = sala.getJogadores();
		
		for(Jogador jogador : jogadores){
			ClientesNaSala.add(servidor.getGerenciadorDoCliente(jogador.getNome()));
		}
		
		for (GerenciadorDoCliente gdc : ClientesNaSala){
			String msg = "atualizarpartida";
			gdc.writerRetorno.println(msg);
			gdc.writerRetorno.flush();
			System.out.println("[*OUT] " + jogador + ": " + msg);
		}
	}
	
	private void ChatPartida(){
		List<GerenciadorDoCliente> ClientesNaSala = new ArrayList<>();
		Sala sala = sistema.jogador(jogador).getSalaAtual();
		List<Jogador> jogadores = sala.getJogadores();
		
		for(Jogador jogador : jogadores){
			ClientesNaSala.add(servidor.getGerenciadorDoCliente(jogador.getNome()));
		}
		
		for (GerenciadorDoCliente gdc : ClientesNaSala){
			String msg = "chatpartida";
			gdc.writerRetorno.println(msg);
			gdc.writerRetorno.flush();
			System.out.println("[*OUT] " + jogador + ": " + msg);
		}
	}
	
	private void AbandonarPartida(){
		List<GerenciadorDoCliente> ClientesNaSala = new ArrayList<>();
		Sala sala = sistema.jogador(jogador).getSalaAtual();
		List<Jogador> jogadores = sala.getJogadores();
		
		for(Jogador jogador : jogadores){
			ClientesNaSala.add(servidor.getGerenciadorDoCliente(jogador.getNome()));
		}
		
		for (GerenciadorDoCliente gdc : ClientesNaSala){
			String msg = "abandonarpartida";
			gdc.writerRetorno.println(msg);
			gdc.writerRetorno.flush();
			System.out.println("[*OUT] " + jogador + ": " + msg);
		}
	}
	
	private void AbraTeCesamo(){
		List<GerenciadorDoCliente> ClientesNaSala = new ArrayList<>();
		Sala sala = sistema.jogador(jogador).getSalaAtual();
		List<Jogador> jogadores = sala.getJogadores();
		
		for(Jogador jogador : jogadores){
			ClientesNaSala.add(servidor.getGerenciadorDoCliente(jogador.getNome()));
		}
		
		for (GerenciadorDoCliente gdc : ClientesNaSala){
			gdc.writerRetorno.println("abrepartida");
			gdc.writerRetorno.flush();
		}
	}
	
	private boolean fecharConexao(){
		try{
			clientSocket.close();
			socketRetorno.close();
			return true;
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
	}

	public String getNomeJogador() {
		
		return jogador;
	}

}
